package com.xcc.datastructure;

import com.alibaba.fastjson.JSONArray;

/**
 * @Description 求【两数之和】练习
 *
 * 题目描述：
 * 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target 的那两个整数，并返回它们的数组下标。
 * 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
 * 你可以按任意顺序返回答案。
 * <p>
 * 示例一：
 * 输入：nums = [2,7,11,15], target = 9
 * 输出：[0,1]
 * 解释：因为 nums[0] + nums[1] == 9 ，返回 [0, 1] 。
 * <p>
 * 示例二：
 * 输入：nums = [3,2,4], target = 6
 * 输出：[1,2]
 * <p>
 * 示例三：
 * 输入：nums = [3,3], target = 6
 * 输出：[0,1]
 *
 * @Author xiechuang
 * @Date 2021/12/19
 */
public class TwoSumDemo {

    public static void main(String[] args) {

        // 预期结果：[0,1]
        int[] nums1 = new int[]{2, 7, 11, 15};
        int target1 = 9;
        System.out.println(JSONArray.toJSONString(twoSum(nums1, target1)));

        // 预期结果：[1,2]
        int[] nums2 = new int[]{3, 2, 4};
        int target2 = 6;
        System.out.println(JSONArray.toJSONString(twoSum(nums2, target2)));

        // 预期结果：[01]
        int[] nums3 = new int[]{3, 3};
        int target3 = 6;
        System.out.println(JSONArray.toJSONString(twoSum(nums3, target3)));

        // 预期结果：[-1,-1]
        int[] nums4 = new int[]{3};
        int target4 = 6;
        System.out.println(JSONArray.toJSONString(twoSum(nums4, target4)));

    }

    /**
     * 思路：两层遍历，一层遍历通过目标值减去当前元素值，然后结果值与二层遍历比较，相同则跳出循环。
     * 注意：二层遍历从当前元素的下一个元素开始
     *
     * @param nums
     * @param target
     * @return
     */
    public static int[] twoSum(int[] nums, int target) {
        int length = nums.length;
        int[] array = new int[]{-1, -1};
        for (int i = 0; i < length; i++) {
            int value = target - nums[i];
            if (i < (length - 1)) {
                for (int j = i + 1; j < length; j++) {
                    if (value == nums[j]) {
                        array[0] = i;
                        array[1] = j;
                        break;
                    }
                }
            }
        }
        return array;
    }

}
